namespace SmartMathLibrary.Geometry
{
    /// <summary>
    /// An interface to implement a Line2D.
    /// </summary>
    public interface ILine2D
    {
        /// <summary>
        /// Gets or sets the start point of the line.
        /// </summary>
        /// <value>The start point of the line.</value>
        Point2D StartPoint { get; set; }

        /// <summary>
        /// Gets or sets the endpoint of the line.
        /// </summary>
        /// <value>The endpoint of the line.</value>
        Point2D EndPoint { get; set; }

        /// <summary>
        /// Calculates the length of the line.
        /// </summary>
        /// <returns>The length of the line.</returns>
        double GetLineLength();

        /// <summary>
        /// Compares the current instance of a line with another line object. 
        /// </summary>
        /// <param name="compare">The line to compare.</param>
        /// <returns>True if the position of the lines are even otherwise the method will 
        /// return false.</returns>
        bool CompareTo(Line2D compare);

        /// <summary>
        /// Translates the line with the specified parameters.
        /// </summary>
        /// <param name="translateValue">The value with which the line has to be translated.</param>
        void TranslateLine(double translateValue);

        /// <summary>
        /// Translates the line with the specified parameters.
        /// </summary>
        /// <param name="translateValueX">The translate value for the x position.</param>
        /// <param name="translateValueY">The translate value for the y position.</param>
        void TranslateLine(double translateValueX, double translateValueY);

        /// <summary>
        /// Scales the line with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor for x and y position.</param>
        void ScaleLine(double scaleFactor);

        /// <summary>
        /// Scales the line with specified factors.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        void ScaleLine(double scaleFactorX, double scaleFactorY);
    }
}